package com.lj.universalframework.utils

import android.os.SystemClock
import android.view.View
import com.lj.universalframework.R

/**
 * <p>文件名：RepeatClick
 * <p>创建者：LJ
 * <p>创建日期：2020\7\21 0021 16:11
 * <p>描述： 防止view重复点击
 */

//全局互斥时间
private var mutualExclusionTime = 0L

//全局互斥长度
private var mutuallyExclusiveLength = 0L

/**
 * get set
 * 给view添加一个上次触发时间的属性（用来屏蔽连击操作）
 */
private var <T : View>T.triggerLastTime: Long
    get() = if (getTag(R.id.triggerLastTimeKey) != null) getTag(R.id.triggerLastTimeKey) as Long else 0
    set(value) {
        setTag(R.id.triggerLastTimeKey, value)
    }

/**
 * get set
 * 给view添加一个延迟的属性（用来屏蔽连击操作）
 */
private var <T : View> T.triggerDelay: Long
    get() = if (getTag(R.id.triggerDelayKey) != null) getTag(R.id.triggerDelayKey) as Long else -1
    set(value) {
        setTag(R.id.triggerDelayKey, value)
    }

/**
 * 判断时间是否满足再次点击的要求（控制点击）
 */
private fun <T : View> T.clickEnable(): Boolean {
    var clickable = false
    //这里使用SystemClock.elapsedRealtime() 系统启动时间，会有更高的安全性，如果使用系统时间，用户可能修改系统时间导致无法点击
    val currentClickTime = SystemClock.elapsedRealtime()
    if (currentClickTime - triggerLastTime >= triggerDelay) {
        clickable = true
        triggerLastTime = currentClickTime
    }
    return clickable
}

/***
 * 带延迟过滤点击事件的 View 扩展,禁止规定时间内重复点击
 * @param delay Long 延迟时间，默认1000毫秒
 * @param block: (T) -> Unit 函数
 * @return Unit
 */
fun <T : View> T.clickWithTrigger(delay: Long = 1000, block: (T) -> Unit) {
    triggerDelay = delay
    setOnClickListener {
        //这里使用SystemClock.elapsedRealtime() 系统启动时间，会有更高的安全性，如果使用系统时间，用户可能修改系统时间导致无法点击
        val currentClickTime = SystemClock.elapsedRealtime()
        if (currentClickTime - mutualExclusionTime < mutuallyExclusiveLength) {
            return@setOnClickListener
        }
        if (clickEnable()) {
            block(this)
        }
    }
}

/***
 * 带延迟过滤点击事件的 View 扩展,禁止规定时间内重复点击
 * @param delay Long 延迟时间，默认1000毫秒
 * @param block: (T) -> Unit 函数
 * @return Unit
 */
fun <T : View> List<T>.clickWithTriggerS(delay: Long = 1000, block: (T) -> Unit) {
    forEach() {
        it.apply {
            triggerDelay = delay
            setOnClickListener {
                //这里使用SystemClock.elapsedRealtime() 系统启动时间，会有更高的安全性，如果使用系统时间，用户可能修改系统时间导致无法点击
                val currentClickTime = SystemClock.elapsedRealtime()
                if (currentClickTime - mutualExclusionTime < mutuallyExclusiveLength) {
                    return@setOnClickListener
                }
                if (clickEnable()) {
                    block(this)
                }
            }
        }
    }
}


/***
 * 带延迟过滤点击事件的 View 扩展,禁止规定时间内重复点击 互斥
 * @param delay Long 延迟时间，默认1000毫秒
 * @param block: (T) -> Unit 函数
 * @return Unit
 */
fun <T : View> T.clickMutuallyExclusive(delay: Long = 1000, block: (T) -> Unit) {
    triggerDelay = delay
    setOnClickListener {
        //这里使用SystemClock.elapsedRealtime() 系统启动时间，会有更高的安全性，如果使用系统时间，用户可能修改系统时间导致无法点击
        val currentClickTime = SystemClock.elapsedRealtime()
        if (currentClickTime - mutualExclusionTime >= triggerDelay) {
            mutualExclusionTime = currentClickTime
            triggerLastTime = currentClickTime
            mutuallyExclusiveLength = triggerDelay
            block(this)
        }
    }
}
